package net.oschina.git.fsppp.view.contract;

import net.oschina.git.fsppp.model.P3Dir;
import net.oschina.git.fsppp.common.base.BaseModel;
import net.oschina.git.fsppp.common.base.BasePresenter;
import net.oschina.git.fsppp.common.base.BaseView;
import net.oschina.git.fsppp.model.P3FAT;
import net.oschina.git.fsppp.model.SimpleResponse;
import rx.Observable;

import java.util.LinkedList;
import java.util.List;

/**
 * Created by QiHuang on 2016/10/7.
 */
public interface FileOPContract {
    interface Model extends BaseModel {
        /**
         * 获取初始化磁盘
         * @return
         */
        Observable<SimpleResponse<List<P3Dir>>> getInitialDisk();

        /**
         * 获取当前路径文件夹和文件
         * @param dirPath
         * @return
         */
        Observable<SimpleResponse<List<P3Dir>>> getCurrentFile(String dirPath);

        /**
         * 创建新的文件（夹）
         * @param name
         * @param dirPath
         * @return
         */
        Observable<SimpleResponse<P3Dir>> createNewDir(String dirPath, String name);
        Observable<SimpleResponse<P3Dir>> createNewFile(String path, String name);

        /**
         * 获取子目录
         * @param parent
         * @return
         */
        Observable<SimpleResponse<List<P3Dir>>> getChildDirs(P3Dir parent);

        /**
         * 获取文件分配表
         * @param diskName
         * @return
         */
        Observable<P3FAT> getFatByDisk(String diskName);

        /**
         * 修改文件（夹）
         * @param dir
         * @return
         */
        Observable<SimpleResponse<P3Dir>> editFile(P3Dir dir);

        /**
         * 删除文件（夹）
         * @param dir
         * @return
         */
        Observable<SimpleResponse<P3Dir>> deleteFile(P3Dir dir);

        /**
         * 格式化磁盘
         * @param diskName
         * @return
         */
        Observable<SimpleResponse> formatDisk(String diskName);

        /**
         * 获取文件分配链
         * @param dir
         * @return
         */
        Observable<LinkedList<Integer>> getFileLink(P3Dir dir);

        /**
         * 搜索文件
         * @param path 起始路径
         * @param filename
         * @return
         */
        Observable<SimpleResponse<List<P3Dir>>> searchFile(String path, String filename);
    }

    interface View extends BaseView {
        /**
         * 处理文件集合
         */
        void returnCurrentFile(List<P3Dir> list);

        /**
         * 新建文件成功
         * @param dir
         */
        void returnNewDirOrFile(P3Dir dir);

        /**
         * 初始化磁盘
         * @param dirs
         */
        void returnInitialDisk(List<P3Dir> dirs);

        /**
         * 返回文件分配表
         * @param fatBytes
         */
        void returnFatBytes(Byte[] fatBytes);

        /**
         * 返回修改后的文件
         * @param dir
         */
        void returnEditedFile(P3Dir dir);

        /**
         * 是否删除完成
         * @param isDeleted
         */
        void returnDelResult(boolean isDeleted);

        /**
         * 是否格式化成功
         * @param isFormated
         */
        void returnFormatResult(boolean isFormated);

        /**
         * 返回文件分配链
         * @param linkedList
         */
        void returnFileLink(LinkedList<Integer> linkedList);

        /**
         * 返回搜索结果
         */
        void returnSearchResult(List<P3Dir> list);
    }

    abstract class Presenter extends BasePresenter<View, Model> {
        public Presenter(View view, Model model) {
            super(view, model);
        }

        /**
         * 获取当前目录文件集合
         * @param dirPath 文件夹路径
         */
        public abstract void getCurrentFile(String dirPath);

        /**
         * 创建新的文件（夹）
         * @param dirPath
         * @param name
         */
        public abstract void createNewDir(String dirPath, String name);
        public abstract void createNewFile(String dirPath, String name);


        /**
         * 读取子目录
         * @param parent
         */
        public abstract void getChildDirs(P3Dir parent);

        /**
         * 初始化磁盘
         */
        public abstract void initDisk();

        /**
         * 获取文件分配表
         * @param diskName
         */
        public abstract void geFatList(String diskName);

        /**
         * 修改文件
         * @param dir
         */
        public abstract void editFile(P3Dir dir);

        /**
         * 删除文件
         * @param dir
         */
        public abstract void deleteFile(P3Dir dir);

        /**
         * 格式化磁盘
         * @param diskName
         */
        public abstract void formatDisk(String diskName);

        /**
         * 获取文件分配链
         * @param dir
         */
        public abstract void getFileLink(P3Dir dir);

        /**
         * 搜索文件
         * @param filename
         */
        public abstract void searchFile(String path, String filename);
    }
}
